/**
 * 
 */

package com.gustozzi.distribucion.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.negocio.DistribucionBO;
import com.gustozzi.distribucion.negocio.impl.DistribucionBOImpl;
import com.gustozzi.domain.Despacho;
import com.gustozzi.domain.HojaRuta;
import com.gustozzi.domain.Pedido;
import com.gustozzi.domain.Producto;
import com.gustozzi.domain.Usuario;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author FABRIZIO
 * 
 */
public class HojaRutaAction extends ActionSupport implements ServletRequestAware
{
    private static final long serialVersionUID = 1L;
    DistribucionBO distribucionBO = new DistribucionBOImpl();
    private String botonSeleccionado;
    private HojaRuta hojaRuta;
    private List<HojaRuta> listaHojasRuta;
    private List<Despacho> listaDespachos;
    private List<Pedido> listaPedidos;
    private List<Producto> listaTotalizados;
    private List<Producto> listaProductos;
    private String codigoSeleccionado;
    private HttpServletRequest request;

    public String execute()
    {
        String destino = Constantes.CADENA_VACIA;
        if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_FILTRAR))
        {
            destino = obtenerListaHojasRuta();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_NUEVO))
        {
            destino = nuevaHojaRuta();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_VERDESPACHO))
        {
            destino = verDespacho();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_MOSTRARDESPACHOS))
        {
            destino = mostrarDespachos();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_MOSTRARPEDIDOS))
        {
            destino = mostrarPedidos();
        }
        else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_GUARDAR))
        {
            destino = guardarDespacho();
        }
        else
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String obtenerListaHojasRuta()
    {
        String destino = Constantes.CADENA_VACIA;
        List<HojaRuta> lista = null;
        try
        {
            String codigo = hojaRuta.getCodigo();
            String codigoCentroDistribucion = hojaRuta.getCentroDistribucion().getCodigo();
            String fechaDesde = hojaRuta.getFechaDesde();
            String fechaHasta = hojaRuta.getFechaHasta();

            lista = new ArrayList<HojaRuta>();
            lista = distribucionBO.obtenerListaHojasRuta(codigo, codigoCentroDistribucion, fechaDesde, fechaHasta);
            this.setListaHojasRuta(lista);
            request.getSession().setAttribute(Constantes.LISTAHOJASSESSION, lista);
            destino = Constantes.CONSULTARHOJASRUTA;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String nuevaHojaRuta()
    {
        hojaRuta.setCodigo("TEMP");
        String destino = Constantes.NUEVAHOJARUTA;
        return destino;
    }

    public String verDespacho()
    {
        String destino = Constantes.CADENA_VACIA;
        try
        {
            request.getSession().setAttribute("ORIGENDESPACHO", "HOJARUTA");
            destino = Constantes.VERDESPACHO;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String mostrarDespachos()
    {
        String destino = "";
        List<Despacho> listaDespachos = null;
        String codigoDespacho = codigoSeleccionado;
        try
        {
            listaDespachos = (ArrayList<Despacho>) request.getSession().getAttribute("listaDespachosSession");
            for (int i = 0; i < listaDespachos.size(); i++)
            {
                Despacho despacho = listaDespachos.get(i);
                if (despacho.getCodigo().equalsIgnoreCase(codigoDespacho))
                {
                    setListaPedidos(despacho.getListaPedidos());
                    request.getSession().setAttribute("listaPedidosSession", despacho.getListaPedidos());
                    break;
                }
            }
            setListaDespachos(listaDespachos);
            destino = Constantes.MOSTRARDESPACHOS;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String mostrarPedidos()
    {
        String destino = "";
        List<Pedido> listaPedidos = null;
        List<Producto> listaProductosTotalizados = null;
        String codigoPedido = codigoSeleccionado;
        try
        {
            destino = mostrarDespachos();
            listaPedidos = (ArrayList<Pedido>) request.getSession().getAttribute("listaPedidosSession");
            for (int i = 0; i < listaPedidos.size(); i++)
            {
                Pedido pedido = listaPedidos.get(i);
                if (pedido.getCodigo().equalsIgnoreCase(codigoPedido))
                {
                    setListaProductos(pedido.getListaProductos());
                    break;
                }
            }
            setListaPedidos(listaPedidos);
            calcularTotalizados(listaPedidos);
            listaProductosTotalizados = (ArrayList<Producto>) request.getSession().getAttribute(
                    "listaTotalizadosSession");
            setListaTotalizados(listaProductosTotalizados);
            destino = Constantes.MOSTRARDESPACHOS;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    //TODO CAMBIAR LOS VALORES DEL DESTINO CUANDO SI GUARDE
    public String guardarDespacho()
    {
        String destino = Constantes.CADENA_VACIA;
        String respuesta = Constantes.CADENA_VACIA;
        try
        {
            String datosDespacho = request.getParameter("fechaEntrega");
            String[] datos = datosDespacho.split(":");

            Usuario usuario = (Usuario) request.getSession().getAttribute("usuarioSession");

  //          respuesta = distribucionBO.guardarDespacho(datos[1], datos[0], usuario.getCodigo());

            if (respuesta.equalsIgnoreCase(Constantes.ERROR))
            {
                destino = Constantes.CONSULTARHOJASRUTA;
            }
            else
            {
                destino = Constantes.CONSULTARHOJASRUTA;
            }
        }
        catch (Exception e)
        {
            destino = Constantes.CONSULTARHOJASRUTA;
        }
        return destino;
    }

    public void calcularTotalizados(List<Pedido> listaPedidosSeleccionados)
    {
        List<Producto> listaTotalizadosArmada = null;
        List<Producto> listaProductosTotales = new ArrayList<Producto>();

        for (int n = 0; n < listaPedidosSeleccionados.size(); n++)
        {
            Pedido pedidoTotalizados = listaPedidosSeleccionados.get(n);
            List<Producto> listaProductosTotalizados = (ArrayList<Producto>) pedidoTotalizados.getListaProductos();
            listaProductosTotales.addAll(listaProductosTotalizados);
        }

        HashMap<String, List<Producto>> tablaProductos = new HashMap<String, List<Producto>>();
        List<Producto> listaProductosIguales = new ArrayList<Producto>();
        for (int p = 0; p < listaProductosTotales.size(); p++)
        {
            Producto prod = listaProductosTotales.get(p);
            if (p == 0)
            {
                listaProductosIguales.add(prod);
                tablaProductos.put(prod.getCodigo(), listaProductosIguales);
            }
            else
            {
                if (tablaProductos.containsKey(prod.getCodigo()))
                {
                    List<Producto> listaRetorno = (ArrayList<Producto>) tablaProductos.get(prod.getCodigo());
                    listaRetorno.add(prod);
                    tablaProductos.remove(prod.getCodigo());
                    tablaProductos.put(prod.getCodigo(), listaRetorno);
                }
                else
                {
                    listaProductosIguales = new ArrayList<Producto>();
                    listaProductosIguales.add(prod);
                    tablaProductos.put(prod.getCodigo(), listaProductosIguales);
                }
            }
        }

        Iterator<Entry<String, List<Producto>>> itr = tablaProductos.entrySet().iterator();
        listaTotalizadosArmada = new ArrayList<Producto>();
        while (itr.hasNext())
        {
            Entry<String, List<Producto>> list = itr.next();
            List<Producto> listaTotalProductos = (ArrayList<Producto>) list.getValue();
            Producto productoTotalizado = new Producto();
            int cantidadTotal = 0;
            double pesoTotal = 0;
            String nombre = "";
            for (int x = 0; x < listaTotalProductos.size(); x++)
            {
                Producto producto = (Producto) listaTotalProductos.get(x);
                cantidadTotal += producto.getCantidad();
                pesoTotal += producto.getPeso();
                nombre = producto.getDescripcion();
            }
            productoTotalizado.setCodigo(list.getKey());
            productoTotalizado.setCantidad(cantidadTotal);
            productoTotalizado.setPeso(pesoTotal * cantidadTotal);
            productoTotalizado.setNombre(nombre);
            productoTotalizado.setDescripcion(nombre);
            listaTotalizadosArmada.add(productoTotalizado);
            setListaTotalizados(listaTotalizadosArmada);
        }
        request.getSession().setAttribute("listaTotalizadosSession", listaTotalizadosArmada);
    }

    @Override
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;
    }

    /**
     * @return the distribucionBO
     */
    public DistribucionBO getDistribucionBO()
    {
        return distribucionBO;
    }

    /**
     * @return the botonSeleccionado
     */
    public String getBotonSeleccionado()
    {
        return botonSeleccionado;
    }

    /**
     * @return the hojaRuta
     */
    public HojaRuta getHojaRuta()
    {
        return hojaRuta;
    }

    /**
     * @return the listaHojasRuta
     */
    public List<HojaRuta> getListaHojasRuta()
    {
        return listaHojasRuta;
    }

    /**
     * @return the listaDespachos
     */
    public List<Despacho> getListaDespachos()
    {
        return listaDespachos;
    }

    /**
     * @return the listaPedidos
     */
    public List<Pedido> getListaPedidos()
    {
        return listaPedidos;
    }

    /**
     * @return the listaTotalizados
     */
    public List<Producto> getListaTotalizados()
    {
        return listaTotalizados;
    }

    /**
     * @return the listaProductos
     */
    public List<Producto> getListaProductos()
    {
        return listaProductos;
    }

    /**
     * @return the codigoSeleccionado
     */
    public String getCodigoSeleccionado()
    {
        return codigoSeleccionado;
    }

    /**
     * @param distribucionBO
     *            the distribucionBO to set
     */
    public void setDistribucionBO(DistribucionBO distribucionBO)
    {
        this.distribucionBO = distribucionBO;
    }

    /**
     * @param botonSeleccionado
     *            the botonSeleccionado to set
     */
    public void setBotonSeleccionado(String botonSeleccionado)
    {
        this.botonSeleccionado = botonSeleccionado;
    }

    /**
     * @param hojaRuta
     *            the hojaRuta to set
     */
    public void setHojaRuta(HojaRuta hojaRuta)
    {
        this.hojaRuta = hojaRuta;
    }

    /**
     * @param listaHojasRuta
     *            the listaHojasRuta to set
     */
    public void setListaHojasRuta(List<HojaRuta> listaHojasRuta)
    {
        this.listaHojasRuta = listaHojasRuta;
    }

    /**
     * @param listaDespachos
     *            the listaDespachos to set
     */
    public void setListaDespachos(List<Despacho> listaDespachos)
    {
        this.listaDespachos = listaDespachos;
    }

    /**
     * @param listaPedidos
     *            the listaPedidos to set
     */
    public void setListaPedidos(List<Pedido> listaPedidos)
    {
        this.listaPedidos = listaPedidos;
    }

    /**
     * @param listaTotalizados
     *            the listaTotalizados to set
     */
    public void setListaTotalizados(List<Producto> listaTotalizados)
    {
        this.listaTotalizados = listaTotalizados;
    }

    /**
     * @param listaProductos
     *            the listaProductos to set
     */
    public void setListaProductos(List<Producto> listaProductos)
    {
        this.listaProductos = listaProductos;
    }

    /**
     * @param codigoSeleccionado
     *            the codigoSeleccionado to set
     */
    public void setCodigoSeleccionado(String codigoSeleccionado)
    {
        this.codigoSeleccionado = codigoSeleccionado;
    }
}
